# 字典(dict)和集合(set)
# 字典在Python3.7+版本是有序的数据结构,而集合是无序的
# 字典和集合底层都是采用哈希表结构,保证了其查找、插入、删除操作的高效性。所以,字典和集合通常运用在对元素的高效查找、去重等场景。

if __name__ == '__main__':
    # 创建字典
    d1 = {'name': 'zsa', 'age': 32, 'gender': 'male'}
    d2 = dict({'name': 'zsa', 'age': 32, 'gender': 'male'})
    d3 = dict([('name', 'zsa'), ('age', 32), ('gender', 'male')])
    d4 = dict(name='zsa', age=32, gender='male')
    print(d1 == d2 == d3 == d4)

    # 创建集合
    s1 = {1, 2, 3}
    s2 = set([1, 2, 3])
    print(s1 == s2)

    # 字典和集合中的元素都可以是混合类型
    s = {123, 'abc', 3.14}
    print(s)

    # 字典的访问
    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    print(dic.get('k1'))  # 字典可以根据key访问value
    print(dic.get('k4'))  # 如果key不存在,则会返回None

    # 集合的访问
    s = {1, 2, 3}
    # 可以通过 value in dict/set 来判断一个元素是否在字典/集合中
    print((1 in s))
    print((4 in s))

    # 字典的增删改操作
    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    # 新增元素
    dic['k4'] = 'v4'
    # 修改元素
    dic['k1'] = 'v1.1'
    # 删除元素
    dic.pop('k2')
    print(dic)

    # 集合的增删改操作
    s = {1, 2, 3}
    print(s)
    # 新增元素
    s.add(4)
    print(s)
    # 删除元素
    s.remove(2)
    print(s)
    # 删除最后一个元素
    # 因为集合是无序的,所以实际删除的是哪个元素是不确定的,pop操作要慎用
    s.pop()
    print(s)

    # 对字典进行排序
    d = {'a': 10, 'c': 5, 'b': 12}
    # 按照key进行排序
    d_sorted_by_key = sorted(d.items(), key=lambda x: x[0])
    print("d_sorted_by_key: ", d_sorted_by_key)
    # 按照value进行排序
    d_sorted_by_value = sorted(d.items(), key=lambda x: x[1])
    print("d_sorted_by_value: ", d_sorted_by_value)

    # 对集合进行排序
    s = {5, -100, 10, -99}
    # 直接调用内置的sorted函数
    sorted_s = sorted(s)
    print(sorted_s)

    # 字典的遍历
    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    # 遍历key-value
    for k, v in dic.items():
        print(f'{k} -> {v}')
    # 仅遍历key
    for k in dic.keys():
        print(f'{k}')
    # 仅遍历value
    for v in dic.values():
        print(f'{v}')

    # 集合的遍历
    s = {1, 2, 3, 4, 5}
    for i in s:
        print(f'{i}')
